package com.sec.android.app.myfiles.shadow.android;

import android.media.MediaMetadataRetriever;

import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;

import java.util.ArrayList;
import java.util.Locale;

/**
 * Created by jaebae on 2016-07-01.
 */

@Implements(MediaMetadataRetriever.class)
public class ShadowMediaMetadataRetriever {
    String mFIleName;

    private static ArrayList<MimeTypeMatcher> sAudioMimeType = new ArrayList<>();
    private static ArrayList<MimeTypeMatcher> sVideoMimeType = new ArrayList<>();

    static {
        sVideoMimeType.add(new MimeTypeMatcher("MPEG", "video/mpeg"));
        sVideoMimeType.add(new MimeTypeMatcher("MPG", "video/mpeg"));
        sVideoMimeType.add(new MimeTypeMatcher("MP4", "video/mp4"));
        sVideoMimeType.add(new MimeTypeMatcher("M4V", "video/mp4"));
        sVideoMimeType.add(new MimeTypeMatcher("3GP", "video/3gpp"));
        sVideoMimeType.add(new MimeTypeMatcher("3GPP", "video/3gpp"));
        sVideoMimeType.add(new MimeTypeMatcher("3G2", "video/3gpp2"));
        sVideoMimeType.add(new MimeTypeMatcher("3GPP2", "video/3gpp2"));
        sVideoMimeType.add(new MimeTypeMatcher("WMV", "video/x-ms-wmv"));
        sVideoMimeType.add(new MimeTypeMatcher("ASF", "video/x-ms-asf"));
        sVideoMimeType.add(new MimeTypeMatcher("AVI", "video/avi"));
        sVideoMimeType.add(new MimeTypeMatcher("DIVX", "video/divx"));
        sVideoMimeType.add(new MimeTypeMatcher("FLV", "video/flv"));
        sVideoMimeType.add(new MimeTypeMatcher("MKV", "video/x-matroska"));
        sVideoMimeType.add(new MimeTypeMatcher("SDP", "application/sdp"));
        sVideoMimeType.add(new MimeTypeMatcher("TS", "video/mp2ts"));
        sVideoMimeType.add(new MimeTypeMatcher("PYV", "video/vnd.ms-playready.media.pyv"));
        sVideoMimeType.add(new MimeTypeMatcher("MOV", "video/quicktime"));
        sVideoMimeType.add(new MimeTypeMatcher("SKM", "video/skm"));
        sVideoMimeType.add(new MimeTypeMatcher("K3G", "video/k3g"));
        sVideoMimeType.add(new MimeTypeMatcher("AK3G", "video/ak3g"));
        sVideoMimeType.add(new MimeTypeMatcher("WEBM", "video/webm"));
        sVideoMimeType.add(new MimeTypeMatcher("MTS", "video/mp2ts"));
        sVideoMimeType.add(new MimeTypeMatcher("M2TS", "video/mp2ts"));
        sVideoMimeType.add(new MimeTypeMatcher("M2T", "video/mp2ts"));
        sVideoMimeType.add(new MimeTypeMatcher("TRP", "video/mp2ts"));
        sVideoMimeType.add(new MimeTypeMatcher("TP", "video/mp2ts"));

        //Audio
        sAudioMimeType.add(new MimeTypeMatcher("MP3", "audio/mpeg"));
        sAudioMimeType.add(new MimeTypeMatcher("M4A", "audio/mp4"));
        sAudioMimeType.add(new MimeTypeMatcher("WAV", "audio/x-wav"));
        sAudioMimeType.add(new MimeTypeMatcher("AMR", "audio/amr"));
        sAudioMimeType.add(new MimeTypeMatcher("AWB", "audio/amr-wb"));
        sAudioMimeType.add(new MimeTypeMatcher("WMA", "audio/x-ms-wma"));
        sAudioMimeType.add(new MimeTypeMatcher("OGG", "audio/ogg"));
        sAudioMimeType.add(new MimeTypeMatcher("OGA", "application/ogg"));
        sAudioMimeType.add(new MimeTypeMatcher("AAC", "audio/aac"));
        sAudioMimeType.add(new MimeTypeMatcher("3GA", "audio/3gpp"));
        sAudioMimeType.add(new MimeTypeMatcher("FLAC", "audio/flac"));
        sAudioMimeType.add(new MimeTypeMatcher("MP4", "audio/mp4"));
        sAudioMimeType.add(new MimeTypeMatcher("MP4A", "audio/mp4"));
        sAudioMimeType.add(new MimeTypeMatcher("MPGA", "audio/mpeg"));
        sAudioMimeType.add(new MimeTypeMatcher("3GP", "audio/3gpp"));
        sAudioMimeType.add(new MimeTypeMatcher("3G2", "audio/3gpp2"));
        sAudioMimeType.add(new MimeTypeMatcher("ASF", "audio/x-ms-asf"));
        sAudioMimeType.add(new MimeTypeMatcher("3GPP", "audio/3gpp"));
        sAudioMimeType.add(new MimeTypeMatcher("MID", "audio/midi"));
        sAudioMimeType.add(new MimeTypeMatcher("MIDI", "audio/midi"));
        sAudioMimeType.add(new MimeTypeMatcher("RTX", "audio/midi"));
        sAudioMimeType.add(new MimeTypeMatcher("OTA", "audio/midi"));
        sAudioMimeType.add(new MimeTypeMatcher("XMF", "audio/midi"));
        sAudioMimeType.add(new MimeTypeMatcher("MXMF", "audio/midi"));
        sAudioMimeType.add(new MimeTypeMatcher("RTTTL", "audio/midi"));
        sAudioMimeType.add(new MimeTypeMatcher("SMF", "audio/sp-midi"));
        sAudioMimeType.add(new MimeTypeMatcher("SPMID", "audio/sp-midi"));
        sAudioMimeType.add(new MimeTypeMatcher("IMY", "audio/imelody"));
        sAudioMimeType.add(new MimeTypeMatcher("MKA", "audio/x-matroska"));
        sAudioMimeType.add(new MimeTypeMatcher("PYA", "audio/vnd.ms-playready.media.pya"));
        sAudioMimeType.add(new MimeTypeMatcher("QCP", "audio/qcelp"));
    }

    @Implementation
    public String extractMetadata(int keyCode) {
        String ret = null;
        switch (keyCode) {
            case MediaMetadataRetriever.METADATA_KEY_TITLE:
                ret = "MyTitle";
                break;
            case MediaMetadataRetriever.METADATA_KEY_MIMETYPE:
                if (mFIleName.contains("AUDIO") || mFIleName.contains("MUSIC")) {
                    ret = getMimeType(mFIleName, sAudioMimeType);
                } else if (mFIleName.contains("VIDEO") || mFIleName.contains("MOVIE")) {
                    ret = getMimeType(mFIleName, sVideoMimeType);
                }
                break;
            default:
                break;
        }


        return ret;
    }

    @Implementation
    public void setDataSource(String path) throws IllegalArgumentException {
        mFIleName = path.toUpperCase(Locale.getDefault());
    }


    private static String getMimeType(String fileName, ArrayList<MimeTypeMatcher> matcherList) {
        String ret = null;
        for (MimeTypeMatcher matcher : matcherList) {
            if (fileName.contains(matcher.mExt)) {
                ret = matcher.mMimeType;
            }
        }
        return ret;
    }

    static class MimeTypeMatcher {
        String mExt;
        String mMimeType;

        MimeTypeMatcher(String ext, String mimeType) {
            mExt = ext;
            mMimeType = mimeType;
        }
    }
}
